package edu.uoc.tdp.pac4.server.connexiomanteniment.db;

import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.SQLException;
import java.sql.ResultSet;
import java.util.Date;

import edu.uoc.tdp.pac4.server.connexiomanteniment.exceptions.*;
import edu.uoc.tdp.pac4.beans.Estudiante;
import edu.uoc.tdp.pac4.connexiomanteniment.ResponsableEvents;
import edu.uoc.tdp.pac4.connexiomanteniment.Usuari;


public class GestorEstudiant extends Gestor {
	public GestorEstudiant() {}
	
	public Estudiante getEstudiant(String login) throws ExceptionServer {
	 	Statement st = null; ResultSet rs = null; Estudiante s = null;
		connect();
		try {
			String query = "SELECT idintern, tipususuari, idusuari, pwd, email, estatensistema, tipusdocumentid, document, nom, cognom1, cognom2, dataalta, usuarialta, databaixa, usuaribaixa, datamod, usuarimod, universitat " 
					+        "FROM usuari, estudiant WHERE idintern = idestudiant AND idusuari = '" + login + "'";
			st = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
		 	rs = st.executeQuery(query);
		 	// hem suposat que el login es tambe identificador, es a dir no hi ha mes d'un usuari amb el mateix login
	 		if (rs.next()) {
	 			s = new Estudiante(rs.getString("tipusdocumentid"),rs.getString("document"),rs.getString("nom"),rs.getString("cognom1"),rs.getString("cognom2"),rs.getString("idusuari"),rs.getString("pwd"),rs.getString("email"),rs.getString("universitat"));
	 			s.setIdIntern(rs.getInt("idintern"));
	 			s.setEstatEnSistema(rs.getString("estatensistema").charAt(0));
	 			s.setDataCreacio(rs.getDate("dataalta"));
	 			s.setDataModificacio(rs.getDate("datamod"));
	 			s.setDataEsborrat(rs.getDate("databaixa"));
	 			s.setTipusUsuari(Usuari.TIPUS_USUARI_ESTUDIANT);   // tambe el podem treure de bdd, el tenim en el result set, pero ha de ser aquest, altrament les dades serien inconsistents		
	 			// no informo quin administrador ha fet les operacions, perque de fet en la pantalla de connexio i manteniment aixo no apareix mai
	 		} else throw new ExceptionServer(ExceptionServer.SERVER_DB_USER_NOT_EXIST);   // usuari no existent o no es administrador
		} catch (SQLException e) { ManageSQLException(e); } 
		finally { try { rs.close(); st.close(); disconnect(); } catch(Exception e) { throw new ExceptionServer(ExceptionServer.SERVER_DB_UNEXPECTED_ERROR); } }
		return s;
	}	
	
	public void updateEstudiant(Estudiante e) throws ExceptionServer {
		e.setDataModificacio(new Date()); GestorUsuari gu = new GestorUsuari(); gu._updateusuari(e);
		// i ens queda encara actualitzar la taula estudiant
		int internalId = gu._getUsuariInternalId(e.getIdUsuari());
		connect();
		String update = "UPDATE estudiant SET universitat = ? WHERE idestudiant = ?";
		PreparedStatement st = null;
		try {
	    	st = connection.prepareStatement(update,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
	    	st.setString(1,e.getUniversitat()); st.setInt(2,internalId); 
	 		st.execute();			
		} catch (SQLException ex) { ManageSQLException(ex); } 
		finally { disconnect(); }
	}
	
	public int insertEstudiant(Estudiante e) throws ExceptionServer {
		e.setDataCreacio(new Date()); GestorUsuari gu = new GestorUsuari(); 
		int internalId = gu._insertusuari(e);
		// i ara falta insertar aquest internal id en la taula estudiant
		connect();
		String insert = "INSERT INTO estudiant(idestudiant, universitat) VALUES(?,?)";
    	PreparedStatement st = null;
    	try {
	    	st = connection.prepareStatement(insert,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
	 		st.setInt(1,internalId); st.setString(2,e.getUniversitat());
	 		st.execute();
		} catch (SQLException ex) { ManageSQLException(ex); } 
    	finally { disconnect(); }		
		return internalId;
	}
	
	public void deleteEstudiant(Estudiante e) throws ExceptionServer {
		e.setDataEsborrat(new Date()); e.setEstatEnSistema(Usuari.ESTAT_EN_SISTEMA_INACTIU); updateEstudiant(e);
	}
}
	
